package org.example.aienglishapp.service.login;

import org.example.aienglishapp.dto.login.PermissionDTO;
import org.example.aienglishapp.dto.login.PermissionsWithRolesDTO;
import org.example.aienglishapp.entity.login.Permission;
import org.example.aienglishapp.entity.login.Role;
import org.example.aienglishapp.mapper.login.PermissionMapper;
import org.example.aienglishapp.mapper.login.RoleMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.*;
import java.util.stream.Collectors;

/**
 * 权限服务类。
 *
 * 该类提供了权限管理相关的业务逻辑，包括获取权限信息、为角色分配和移除权限等操作。
 *
 * @author xlj
 * @since 2024-10-1
 * @version 1.0
 */
@Service
public class PermissionService {

    @Autowired
    private RoleMapper roleMapper;

    @Autowired
    private PermissionMapper permissionMapper;

    /**
     * 获取系统中所有的权限信息，并转换为 DTO 格式返回。
     *
     * @return 返回包含所有权限信息的列表
     */
    @Transactional(readOnly = true)
    public List<PermissionDTO> getAllPermissions() {
        List<Permission> permissions = permissionMapper.findAllPermissions();
        return permissions.stream()
                .map(permission -> {
                    PermissionDTO permissionDTO = new PermissionDTO();
                    permissionDTO.setPermissionId(permission.getPermissionId());
                    permissionDTO.setPermissionName(permission.getPermissionName());
                    return permissionDTO;
                })
                .collect(Collectors.toList());
    }

    /**
     * 获取指定权限及其关联的角色信息。
     *
     * @param permissionIds 权限ID列表
     * @return 返回一个包含权限及其关联角色信息的映射，以及不存在的权限ID列表
     */
    @Transactional(readOnly = true)
    public Map<String, Object> getPermissionsWithRoles(List<Long> permissionIds) {
        // 调试：打印输入的权限ID列表
        System.out.println("接收到的权限ID列表: " + permissionIds);

        // 获取指定权限
        List<Permission> permissions = permissionMapper.findPermissionsByIds(permissionIds);
        System.out.println("从数据库中获取到的权限数量: " + permissions.size());

        // 将数据库中存在的权限ID提取出来
        Set<Long> existingPermissionIds = permissions.stream()
                .map(Permission::getPermissionId)
                .collect(Collectors.toSet());
        System.out.println("数据库中存在的权限ID: " + existingPermissionIds);

        // 计算不存在的权限ID
        Set<Long> nonExistingPermissionIds = new HashSet<>(permissionIds);
        nonExistingPermissionIds.removeAll(existingPermissionIds);
        System.out.println("不存在的权限ID: " + nonExistingPermissionIds);

        // 转换为 DTO 并填充关联的角色信息
        List<PermissionsWithRolesDTO> dtoList = permissions.stream()
                .map(permission -> {
                    PermissionsWithRolesDTO dto = new PermissionsWithRolesDTO(
                            permission.getPermissionId(),
                            permission.getPermissionName()
                    );

                    // 设置关联的角色ID和名称，直接使用 Permission 实体中的 roles 属性
                    Set<Role> rolesForPermission = permission.getRoles();
                    Set<Long> roleIds = rolesForPermission.stream().map(Role::getRoleId).collect(Collectors.toSet());
                    Set<String> roleNames = rolesForPermission.stream().map(Role::getRoleName).collect(Collectors.toSet());

                    dto.setRoleIds(roleIds);
                    dto.setRoleNames(roleNames);

                    // 输出调试信息
                    System.out.println("权限: " + dto.getPermissionName());
                    for (String roleName : roleNames) {
                        System.out.println("  - 关联角色: " + roleName);
                    }

                    return dto;
                })
                .collect(Collectors.toList());

        // 准备响应数据
        Map<String, Object> response = new HashMap<>();
        response.put("permissions", dtoList);
        response.put("nonExistingPermissionIds", nonExistingPermissionIds);

        return response;
    }

    /**
     * 为指定角色添加权限。
     *
     * @param roleId         角色ID
     * @param permissionId   权限ID
     * @return 如果操作成功返回 true，否则返回 false
     */
    @Transactional
    public boolean addPermissionToRole(Long roleId, Long permissionId) {
        Role role = roleMapper.findById(roleId);
        Permission permission = permissionMapper.findById(permissionId);

        if (role != null && permission != null) {
            role.getPermissions().add(permission);
            roleMapper.updateRole(role);
            roleMapper.insertRolePermission(roleId, permissionId);
            return true;
        } else {
            return false;
        }
    }

    /**
     * 从指定角色移除权限。
     *
     * @param roleId         角色ID
     * @param permissionId   权限ID
     * @return 如果操作成功返回 true，否则返回 false
     */
    @Transactional
    public boolean removePermissionFromRole(Long roleId, Long permissionId) {
        Role role = roleMapper.findById(roleId);
        Permission permission = permissionMapper.findById(permissionId);

        if (role != null && permission != null) {
            role.getPermissions().remove(permission);
            roleMapper.updateRole(role);
            roleMapper.deleteRolePermission(roleId, permissionId);
            return true;
        } else {
            return false;
        }
    }
}